"""
@project:python起步.py
@author:zhujiahui
@IDE:PyCharm
@time:2021-08-01-16:05
@Introduction:
"""
"""
# （1）什么是可迭代对象？ 可迭代对象要么实现了能返回迭代器的 iter 方法，要么实现了 getitem 方法而且其参数是从零开始的索引。
            具有很多私有的方法，具有__iter__()方法的就是一个可迭代对象
# （2）什么是迭代器？ 迭代器是这样的对象：实现了无参数的 next 方法，返回下一个元素，如果没有元素了，那么抛出 StopIteration 异常；并且实现iter 方法，返回迭代器本身。
            具有__iter__()和__next__()方法 的就是迭代器
                当容器中数据较大的时候使用迭代器
# （3）什么是生成器？ 生成器是带有 yield 关键字的函数。调用生成器函数时，会返回一个生成器对象。
# （4）什么是生成器表达式？ 生成器表达式是创建生成器的简洁句法，这样无需先定义函数再调用
"""
# # 如何判断一个对象是可迭代对象,迭代器对象或生成器
# from collections.abc import Iterable,Iterator,Generator
# def ifiter(ran):
#     #判断是不是可迭代对象
#     if isinstance(ran,Iterable):
#         print(f"{ran}是可迭代的对象")
#     else:
#         print(f"{ran}不是可迭代的对象")
#     #判断是不是迭代器
#     if isinstance(ran,Iterator):
#         print(f"{ran}是迭代器")
#     else:
#         print(f"{ran}不是迭代器")
#     #判断是不是生成器
#     if isinstance(ran, Generator):
#         print(f"{ran}是生成器")
#     else:
#         print(f"{ran}不是生成器")
#
# ran=input("请输入你要判断的数据：")  #range(2,10)
# ifiter(ran)

# 迭代器与生成器的区别:
"""
所有的生成器都是迭代器，有yield的是生成器，因为yield可以是生成器表达式也可以是生成器函数
生成器是一种特殊的迭代器，生成器自动实现了“迭代器协议”（即__iter__和next方法），不需要再手动实现两方法。
生成器在迭代的过程中可以改变当前迭代值，而修改普通迭代器的当前迭代值往往会发生异常，影响程序的执行。
1.迭代器有具体的迭代器类型，可用type查看，一般有list_iterator,set_iterator等类型
2.迭代器是有状态的，可以被next()调用，并且不断返回迭代对象的下一个值，如果到了迭代器的最后一个元素，继续调用next()，则会抛出stopIteration异常
迭代器用于从集合中取出元素
生成器用于凭空生成元素
"""

# 可迭代对象 与迭代器的区别
"""
# 迭代器都是一个可迭代对象，且所有的Iterable(迭代对象)
# 都可以通过内置函数iter()转变为Iterator(迭代器)
可迭代对象：使用灵活，可以直接查看值；占内存，不能迭代取值
迭代器：节省内存，惰性机制；使用不灵活，操作比较繁琐，不能直接查看元素
【特性：一次性的，不可逆的，要一回返回一个】
"""
# # 如何定义一个生成器
#1、推导式生成法
# g = (x for x in range(10))
# print(next(g))
# print(next(g))

# #2、yield关键字生成法
# def my_generator(num):
#     for i in range(num):
#         print("开始生成数据。。。")
#         yield i
#         print("已生成一个数据。。")#暂停位置
# f = my_generator(5)
# for i in f:
#     print(i)


#如何获取可迭代对象、 迭代器与生成器中的数据
"""生成器取值使用next函数获取生成器中的下一个值
value = next(my_generator)
print(value)
"""


# 1、输入两个日期，计算两个日期之间相差的天数


# import datetime
# #strptime() 函数根据指定的格式把一个时间字符串解析为时间元组
# d1 = input("请输入您要计算的较大的日期（格式为：2021-08-01 10:40:20）：")
# d2 = input("请输入您要计算的较小的日期（格式为：2021-08-01 10:40:20）：")
# date1 = datetime.datetime.strptime(d1,"%Y-%m-%d %H:%M:%S").date() #获取日期
# date2 = datetime.datetime.strptime(d2,"%Y-%m-%d %H:%M:%S").date() #获取时间
#
# print((date1-date2).days)

# 2、输入一个数字n，计算n天之前是什么日期，输出日期形式为“2021-07-27”
# import datetime
#
# def getday(y=2021,m=8,d=1,n=0):
#     the_date = datetime.datetime(y,m,d)
#     result_date = the_date + datetime.timedelta(days=n)
#     d = result_date.strftime('%Y-%m-%d')
#     return d
# print(getday(2021,8,1,100)) #8月1日后21天
# print (getday(2021,8,1,-10)) #8月1日前10天

# 3、统计当前文件夹的大小（python实现，预备知识：os模块）
import os
from os.path import join, getsize

def getdirsize(dir):
    #dir为文件夹的绝对路径
    size = 0
    for root, dirs, files in os.walk(dir):
        size += sum([getsize(join(root, name)) for name in files])
    print("该文件夹大小为：",size,"字节")
    return
getdirsize('D:/xsfh')
